#Anaconda/envs/pysagin python
# -*- coding: utf-8 -*-
'''
base.py
=========

.. module:: base
  :platform: Windows, Linux
  :synopsis: 平台基础模块

.. moduleauthor:: WangXi

简介
----


版本
----

- 版本 1.0 (2025/03/28): 初始版本

'''

from astropy.time import Time
from astropy.coordinates import EarthLocation
from astropy import units as u
import numpy as np
import math

class Base():
    '''
    平台基类
    '''
    def __init__(self, name:str, **kwargs):
        self.name = name
        self.init_time:Time = Time.now()
        self.curren_time: Time = Time.now()
        self.init_gps = [0.0, 0.0, 0.0] # 地理坐标系下坐标 [经度, 纬度, 高度km]
        self.current_gps = [0.0, 0.0, 0.0] 
        self.devices:list = []
        
    def update(self, time:Time) -> None:
        self.curren_time = time
    
    def get_current_gps(self) -> list:
        return self.current_gps
    
    def get_gps2xyz(self) -> list[float]:
        """实现从地理坐标到笛卡尔坐标的精确转换。

        Returns:
            list[float]: [X, Y, Z] 单位为千米 (km)
        """
        lon = self.current_gps[0]  # 经度 (°)
        lat = self.current_gps[1]  # 纬度 (°)
        alt_km = self.current_gps[2]  # 高度 (km)

        # 将高度从千米转换为米
        alt = alt_km * 1000  # 转换为米

        # WGS84椭球参数
        a = 6378137.0  # 长半轴，单位：米
        b = 6356752.314245  # 短半轴，单位：米
        f = (a - b) / a  # 扁率
        e_squared = 1 - (b**2 / a**2)  # 第一偏心率平方
        
        lat_rad = math.radians(lat)  # 纬度转弧度
        lon_rad = math.radians(lon)  # 经度转弧度
        
        # 计算卯酉圈曲率半径 N
        N = a / math.sqrt(1 - e_squared * math.sin(lat_rad)**2)
        
        # 计算笛卡尔坐标 X, Y, Z (单位：米)
        X_m = (N + alt) * math.cos(lat_rad) * math.cos(lon_rad)
        Y_m = (N + alt) * math.cos(lat_rad) * math.sin(lon_rad)
        Z_m = ((b**2 / a**2) * N + alt) * math.sin(lat_rad)
        
        # 将结果从米转换为千米
        X_km = X_m / 1000
        Y_km = Y_m / 1000
        Z_km = Z_m / 1000
        
        return [X_km, Y_km, Z_km]

    @staticmethod
    def calculate_distance(gps1: list, gps2: list) -> float:
        """
        使用 Astropy 包计算两个GPS坐标之间的直线距离, 单位km。

        计算依据
        1. 使用 EarthLocation 将经纬度转换为三维空间中的位置。
        2. 使用 SkyCoord 的 separation_3d 方法计算两点间的三维距离。
        3. 返回的距离单位为千米, km。

        Args:
            gps1 (list): 第一个GPS坐标 [经度, 纬度, 高度]
            gps2 (list): 第二个GPS坐标 [经度, 纬度, 高度]

        Returns:
            float: 两点之间的直线距离, 单位km
        """
        lon1, lat1, alt1 = gps1
        lon2, lat2, alt2 = gps2

        # 创建 EarthLocation 对象
        loc1 = EarthLocation.from_geodetic(lon=lon1 * u.deg, lat=lat1 * u.deg, height=alt1 * u.km)
        loc2 = EarthLocation.from_geodetic(lon=lon2 * u.deg, lat=lat2 * u.deg, height=alt2 * u.km)

        distance = np.sqrt((loc1.x - loc2.x)**2 + (loc1.y - loc2.y)**2 + (loc1.z - loc2.z)**2)
        return distance.to(u.km).value
